package com.company.bishi.first;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 笔试第一题
 * 姓名 psnName|	部门序号  deptSort|	部门名称 deptName|
 * 人员排序psnSort|年度year|月份|month| 假期种类type|请假天数amount
 * 张三	2	部门1	10	2022	1	A	3
 * 李四	2	部门1	3	2022	3	A	1
 * 王一	3	部门2	1	2022	2	B	1
 * 周周	3	部门2	3	2022	5	C	1
 * 吴也	1	部门3	1	2022	3	D	2
 * 张三	2	部门1	10	2022	1	B	2
 * 李四	2	部门1	3	2022	3	C	4
 * 王一	3	部门2	1	2022	2	A	3
 * 周周	3	部门2	3	2022	5	B	2
 * 吴也	1	部门3	1	2022	6	A	1
 * 张三	2	部门1	10	2022	1	C	2
 * 李四	2	部门1	3	2022	3	C	1
 * 王一	3	部门2	1	2022	2	D	4
 * 周周	3	部门2	3	2022	5	A	2
 * 吴也	1	部门3	1	2022	6	B	4
 * <p>
 * 要求使用stream对以上数据进行数据处理
 * <p>
 * 1、按部门、年月、人员分组汇总个人总请假天数
 * 2、汇总后的数据按部门序号及人员排序进行排列
 * 3、点击某人，某月数据，可按请假类型汇总显示总请假天数。
 *
 * @author jianf
 * @date 2022年11月16 15:46
 */
public class Static {


    public static void main(String[] args) {
        List<Person> psList = new ArrayList() {{
            add(new Person("张三", 2, "部门1", 10, 2022, 1, "A", 3));
            add(new Person("李四", 2, "部门1", 3, 2022, 3, "A", 1));
            add(new Person("王一", 3, "部门2", 1, 2022, 2, "B", 1));
            add(new Person("周周", 3, "部门2", 3, 2022, 5, "C", 1));
            add(new Person("吴也", 1, "部门3", 1, 2022, 3, "D", 2));
            add(new Person("张三", 2, "部门1", 10, 2022, 1, "B", 2));
        }};

        Static st = new Static();
        st.anser1(psList);
        st.anser2(psList);
        st.anser3(psList, "周周", 2022, 5);
    }

    /**
     * 第一题 按部门、年月、人员分组汇总个人总请假天数
     *
     * @return
     */
    public void anser1(List<Person> dList) {

        Map<String, Map<Integer, Map<Integer, Map<String, Integer>>>> collect = dList.stream().collect(
                Collectors.groupingBy(Person::getDeptName,
                        Collectors.groupingBy(Person::getYear, Collectors.groupingBy(
                                Person::getMonth, Collectors.groupingBy(Person::getPsnName,
                                        Collectors.summingInt(Person::getAmount))
                        ))));
        System.out.println(collect);
    }

    /**
     * 第二问，汇总后的数据按部门序号及人员排序进行排列
     */
    public void anser2(List<Person> dList) {
        // 扁平化分组：
        Map<String, List<Person>> c1 = dList.stream().collect(
                Collectors.groupingBy(p -> p.getDeptName() + "-"
                        + p.getYear().toString() + "." + p.getMonth().toString()
                        + "-" + p.getPsnName()
                )
        );

        List<Person> result = new ArrayList<>(8);
        //把上边的结果转成list
        c1.forEach((k, v) -> {
            Integer sum = v.stream().mapToInt(Person::getAmount).sum();
            Person p = v.get(0);
            p.setAmount(sum);
            result.add(p);
        });
        //进行排序
        List<Person> sr = result.stream().sorted(Comparator.comparing(Person::getDeptSort)
                .thenComparing(Person::getPsnSort)).collect(Collectors.toList());
        System.out.println(sr);
    }

    /**
     * 第三问，点击某人，某月数据，可按请假类型汇总显示总请假天数
     *
     * @param dList
     * @param psnName 选定的人
     * @param year    选定的年
     * @param month   选定的月
     */
    public void anser3(List<Person> dList, String psnName, int year, int month) {

        Map<String, Integer> collect = dList.stream().filter(
                p -> p.getPsnName().equals(psnName) && p.getYear() == year && p.getMonth() == month
        ).collect(
                Collectors.groupingBy(Person::getType, Collectors.summingInt(Person::getAmount))
        );
        System.out.println(collect);
    }
}
